home *** CD-ROM | disk | FTP | other *** search
/ United Public Domain Gold 2 / United Public Domain Gold 2.iso / music_utilities / pt030.dms / pt030.adf / Less / Src / position.c < prev    next >
C/C++ Source or Header  |  1987-06-15  |  2KB  |  108 lines

  1. /*
  2.  * Routines dealing with the "position" table.
  3.  * This is a table which tells the position (in the input file) of the
  4.  * first char on each currently displayed line.
  5.  *
  6.  * {{ The position table is scrolled by moving all the entries.
  7.  *    Would be better to have a circular table 
  8.  *    and just change a couple of pointers. }}
  9.  */
  10.  
  11. #include "less.h"
  12. #include "position.h"
  13.  
  14. #define    NPOS    100        /* {{ sc_height must be less than NPOS }} */
  15. static POSITION table[NPOS];    /* The position table */
  16.  
  17. extern int sc_width, sc_height;
  18.  
  19. /*
  20.  * Return the starting file position of a line displayed on the screen.
  21.  * The line may be specified as a line number relative to the top
  22.  * of the screen, but is usually one of these special cases:
  23.  *    the top (first) line on the screen
  24.  *    the second line on the screen
  25.  *    the bottom line on the screen
  26.  *    the line after the bottom line on the screen
  27.  */
  28.     public POSITION
  29. position(where)
  30.     int where;
  31. {
  32.     switch (where)
  33.     {
  34.     case BOTTOM:
  35.         where = sc_height - 2;
  36.         break;
  37.     case BOTTOM_PLUS_ONE:
  38.         where = sc_height - 1;
  39.         break;
  40.     }
  41.     return (table[where]);
  42. }
  43.  
  44. /*
  45.  * Add a new file position to the bottom of the position table.
  46.  */
  47.     public void
  48. add_forw_pos(pos)
  49.     POSITION pos;
  50. {
  51.     register int i;
  52.  
  53.     /*
  54.      * Scroll the position table up.
  55.      */
  56.     for (i = 1;  i < sc_height;  i++)
  57.         table[i-1] = table[i];
  58.     table[sc_height - 1] = pos;
  59. }
  60.  
  61. /*
  62.  * Add a new file position to the top of the position table.
  63.  */
  64.     public void
  65. add_back_pos(pos)
  66.     POSITION pos;
  67. {
  68.     register int i;
  69.  
  70.     /*
  71.      * Scroll the position table down.
  72.      */
  73.     for (i = sc_height - 1;  i > 0;  i--)
  74.         table[i] = table[i-1];
  75.     table[0] = pos;
  76. }
  77.  
  78. /*
  79.  * Initialize the position table, done whenever we clear the screen.
  80.  */
  81.     public void
  82. pos_clear()
  83. {
  84.     register int i;
  85.  
  86.     for (i = 0;  i < sc_height;  i++)
  87.         table[i] = NULL_POSITION;
  88. }
  89.  
  90. /*
  91.  * See if the byte at a specified position is currently on the screen.
  92.  * Check the position table to see if the position falls within its range.
  93.  * Return the position table entry if found, -1 if not.
  94.  */
  95.     public int
  96. onscreen(pos)
  97.     POSITION pos;
  98. {
  99.     register int i;
  100.  
  101.     if (pos < table[0])
  102.         return (-1);
  103.     for (i = 1;  i < sc_height;  i++)
  104.         if (pos < table[i])
  105.             return (i-1);
  106.     return (-1);
  107. }
  108.